//
//  TWUIRefresh.swift
//  TWeibo
//
//  Created by wtw on 15/8/4.
//  Copyright © 2015年 wtw. All rights reserved.
//

import UIKit

//下拉的偏移量，超出了就开始做翻转动画
private let RefreshPullOffset: CGFloat = -60

class TWUIRefreshControl: UIRefreshControl {
   
    //通过重写系统方法，方便调用
    override func endRefreshing() {
         super.endRefreshing()
        //在结束刷新的同时结束旋转
        refreshView.stopLoading()
    }
    
    //MARK: - KVO
    /*
    向下拉表格， y 值越来越小
    向上推表格， y 值越来越大
    从表格顶部向下拉，y值是负数
    拽到一定幅度，会自动进入刷新状态
    */
    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        
        //如果 y > 0 ，直接返回
        if frame.origin.y>0 {
            return
        }
        
        //UIRefreshControl有一个refreshing属性,需要进行判断
        if refreshing {
            refreshView.startLoading()
        }
        
        //添加一个标记来判断
        if frame.origin.y < RefreshPullOffset && !refreshView.rotateFlag {
            
           refreshView.rotateFlag = true
        } else if frame.origin.y > RefreshPullOffset && refreshView.rotateFlag {
            
           refreshView.rotateFlag = false
        }
        
//        print(frame)
    }
    //指定的构造函数就是init
    override init() {
        super.init()
        
         setupUI()
    }
    //从 xib / sb 加载视图之后，做额外的设置，视图已经创建出来
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    //注销监听
    deinit {
        self.removeObserver(self, forKeyPath: "frame")
    }
    
    //设置界面
   private func setupUI() {
    //KVO 监听 frame 属性的变化
    self.addObserver(self, forKeyPath:"frame", options: NSKeyValueObservingOptions(rawValue: 0), context: nil)
    
    //隐藏默认的转轮
    tintColor = UIColor.clearColor()
    //添加刷新的控件
    addSubview(refreshView)
    print(refreshView.frame)
    //设置自动布局
    refreshView.ff_AlignInner(type: ff_AlignType.CenterCenter, referView: self, size: refreshView.bounds.size)
    }
    //懒加载控件
    private lazy var refreshView: TWUIRefreshView = TWUIRefreshView.refreshView()
}

//下拉刷新视图和动画的实现
class TWUIRefreshView: UIView {
    
    //旋转的标记
    private var rotateFlag = false {
        didSet {
            rotateTipIcon()
        }
    }
    
    @IBOutlet weak var loadIcon: UIImageView!
    @IBOutlet weak var tipView: TWUIRefreshView!
    @IBOutlet weak var tipIcon: UIImageView!
    
    
    /// 从xib加载刷新视图
    class func refreshView() ->TWUIRefreshView {
        return NSBundle.mainBundle().loadNibNamed("Refresh", owner: nil, options: nil).last as! TWUIRefreshView
    }
    
    //图标的旋转
    private func rotateTipIcon() {
        
        //在块代码中，旋转就会有就近原则（以后的细节）
        /*
            顺时针旋转：旋转PI 和 -PI 都是顺时针旋转（默认是顺时针寻找方向）
            解决办法是顺时针的时候减去0.01，逆时针的时候加上0.01
        */
        let angle = rotateFlag ? CGFloat(M_PI - 0.1):CGFloat(M_PI + 0.1)
        
    UIView.animateWithDuration(0.3) { () -> Void in
        
        self.tipIcon.transform = CGAffineTransformRotate(self.tipIcon.transform, angle)
        }
    }
    
    //开始加载动画
   private func startLoading() {
    
    //通过根据key判断动画是否已经添加，如果已经添加就直接返回
    //animationForKey 可以获得添加到图层上的动画
    if loadIcon.layer.animationForKey("loadingAnmi") != nil {
        return
    }
    
    //1.隐藏提示视图
    tipView.hidden = true
    //2.定义动画
    let anmi = CABasicAnimation(keyPath: "transform.rotation")
    anmi.toValue = 2 * M_PI
    anmi.repeatCount = MAXFLOAT
    anmi.duration = 2
    //3.添加动画
    //可以通过再添加一个标记来解决不停下拉转轮飞快转的问题，也可以通过forKey来设定
    loadIcon.layer.addAnimation(anmi, forKey: "loadingAnmi")
    
    }
    //停止加载动画
   private func stopLoading() {
    tipView.hidden = false
    //移除动画
    loadIcon.layer.removeAllAnimations()
    
    }
}
